package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 标准流：IO流处理异常对象
 *
 * 高级流：BufferedOutputStream  缓冲输出流    写      bos.txt
 *       BufferedInputStream    缓冲输入流    读入
 */
public class IOSAPI {
    /**
     * 缓冲输入流：构造器-->异常对象
     * 缓冲输入流：具备功能：合理传输数据 效率提高
     * 构造器具备：添加字符集：UTF8万国码
     * new BufferedOutputStream(低级流引用，size:存字节数组【指定】)
     * 问题1.不能指定字符集
     *    2.不能按照字符读取
     */
    @Test
    public void testBIS(){}
       //创建低级流
     /* FileInputStream fis=
                new FileInputStream("bos.txt");
        BufferedInputStream bos=
                new BufferedInputStream(fis);
        /**
         * read()---读：一个字节，字节数组---->专门读文字

       bos.read();*/
        /**
         * 针对缓冲输出/入功能上的限定----传输：文本
         *
         * 字符流：【转换流】---解决：缓冲输入流读取单位  为字节问题
         *InputStreamReader 读取单位：字符
         * OutputSteamWriter 写出单位：字符 调用字符串getBytes写出文本
         */
        @Test
        public void testOSW(){
            //标准流：

                FileOutputStream fos = null;
                OutputStreamWriter osw = null;
                //标准流：2.捕获异常
                //创建低级流
            try {
                fos =
                        new FileOutputStream("osw.txt");
                //不考虑效率--只传输文本---字符输出流：输出单位字符形式
                //字符流：都可以在构造器第二个参数指定编码集
                osw =
                        new OutputStreamWriter(fos, "UTf8");
                //write()   直接写出文本【不需要将文本转换为字节数组】
                osw.write("1");
                osw.write("2");//换行：字符 char
                osw.write("3");
            }catch(FileNotFoundException e) {//文件不存在
                e.printStackTrace();
            }catch(UnsupportedEncodingException e){//字符集转换
                e.printStackTrace();
            } catch (IOException e) {//IO流异常：所有失败传输总异常
                e.printStackTrace();

            } finally {
                //关闭高级流：字符输出流
                if(osw!=null)
                    try {
                        osw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
            }
        }
    /**
     * 高级流【处理流】---转换流，特点：套在低级流上，被其他高级流套上
     * 字符输入流 ---- 单元测试：testISR()  读入  文本【字符串？】
     * 字符输出流 ---- 单元测试：testOSW()  写出  文本【字符串】
     * InputStreamReader   字符输入流   不可以读入文本
     *
     * 高级流【处理流】---转换流【字符流】---缓冲字符流：解决读入、写出都是字符形式
     * bufferedReader   缓冲字符输入流---解决：InputStreamReader读入字节形式
     *                                      BufferedReader   读入字符形式
     *BufferedWrite
     *
     * 需求：ISR字符输入流读取  osw.txt  文件
     *      当前代码转换为标准流IO：捕获所有异常
     *      读取每行文本？ readLine()   提示：不为null代表文本写出
     *      写出：1    参考：CV复制粘贴
     *      777
     */
    @Test
    public void testISR() throws IOException {
        //创建低级流
        FileInputStream fis=new FileInputStream("osw.txt");
        //创建高级流---转换流--字符输入流，目的：指定编码集--UTF8
        InputStreamReader isr=new InputStreamReader(fis,"UTf8");
        //读 read()  问题：读入数据单位：字节，而不是字符，读字符
        //          转换流---套高级流：缓冲字符输入/出流
        //创建高级流---针对转换流中：字符输入流无法读取形式：
        //                       字符的情况---缓冲字符输入流
        BufferedReader br=new BufferedReader(isr);
        /**BufferedReader类
         * readLine() 读入
         *
         */
        //接收输出字符串
        String line=null;
        //判断条件：文本中一直有内容，一直读  一行文本
        while((line=br.readLine())!=null){
            System.out.println("打印读到字符串："+line);
        }


    }
    /**
     *作业2.读取 IOSAPI.java文件---所有代码--写出
     */
    @Test
    public void testHomeWork2() throws IOException {
       //1.创建文件路径   代表路径:File.separator

       //路径： src\main\java\com\tedu\api\io\IOSAPI.java
        String filePath = "src" + File.separator +
                "main" + File.separator +
                "java" + File.separator +
                "com" + File.separator +
                "tedu" + File.separator +
                "api" + File.separator +
                "io" + File.separator +
                "IOSAPI.java";

        //2.使用try-with-resources     确保资源自动关闭
        try (BufferedReader br =
                     new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"))) {
            String line;
        //3.持续读取直到文件结束
            while ((line = br.readLine()) != null) {
                System.out.println("打印读到的字符串: " + line);
            }
        }    catch (FileNotFoundException e) {
            e.printStackTrace();
        }    catch (IOException e)           {
            e.printStackTrace();
        }
    }


    /**高级流
     * BufferedWriter---低配版本输出流【缓冲输出流】
     * PrintWriter---高配版本输出流【字符输出流】
     *1.高级流不能直接创建---直接创建【不需要创建低级流】--封装
     * 2.封装内存所有流的特点
     * 需求：写出文件pw.txt---文本内容，需要指定编码集：UTF8
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //低级流：输出流
        FileOutputStream fos=new FileOutputStream("pw.txt");
        //创建高级流：转换流，功能：提高效率
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF8");
        //高级流：转换流，功能：提高效率
        BufferedWriter bw=new BufferedWriter(osw);
        //创建高级流：低级流：输出流+转换流+缓冲流
        PrintWriter pw=new PrintWriter("pw.txt","UTF8");
        //写出功能：print()   打印一行文本  不换行
        //         println()  打印一行文本 换行
        //
        pw.print("你就是");
        pw.println("夜神月");
        pw.close();
    }
}


